home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / machine / dec0.c < prev    next >
C/C++ Source or Header  |  2000-04-23  |  17KB  |  558 lines

  1. /*******************************************************************************
  2.  
  3. Data East machine functions - Bryan McPhail, mish@tendril.co.uk
  4.  
  5. * Control reads, protection chip emulations & cycle skipping patches
  6.  
  7. *******************************************************************************/
  8.  
  9. #include "driver.h"
  10.  
  11. extern unsigned char *dec0_ram;
  12. static int GAME,i8751_return,slyspy_state;
  13.  
  14. WRITE_HANDLER( dec0_pf1_control_0_w );
  15. WRITE_HANDLER( dec0_pf1_control_1_w );
  16. WRITE_HANDLER( dec0_pf1_rowscroll_w );
  17. WRITE_HANDLER( dec0_pf1_colscroll_w );
  18. WRITE_HANDLER( dec0_pf1_data_w );
  19. READ_HANDLER( dec0_pf1_data_r );
  20. WRITE_HANDLER( dec0_pf2_control_0_w );
  21. WRITE_HANDLER( dec0_pf2_control_1_w );
  22. WRITE_HANDLER( dec0_pf2_rowscroll_w );
  23. WRITE_HANDLER( dec0_pf2_colscroll_w );
  24. WRITE_HANDLER( dec0_pf2_data_w );
  25. READ_HANDLER( dec0_pf2_data_r );
  26. WRITE_HANDLER( dec0_pf3_control_1_w );
  27. WRITE_HANDLER( dec0_pf3_control_0_w );
  28. WRITE_HANDLER( dec0_pf3_data_w );
  29.  
  30. /******************************************************************************/
  31.  
  32. READ_HANDLER( dec0_controls_r )
  33. {
  34.     switch (offset)
  35.     {
  36.         case 0: /* Player 1 & 2 joystick & buttons */
  37.             return (readinputport(0) + (readinputport(1) << 8));
  38.  
  39.         case 2: /* Credits, start buttons */
  40.             return readinputport(2);
  41.  
  42.         case 4: /* Byte 4: Dipswitch bank 2, Byte 5: Dipswitch Bank 1 */
  43.             return (readinputport(3) + (readinputport(4) << 8));
  44.  
  45.         case 8: /* Intel 8751 mc, Bad Dudes & Heavy Barrel only */
  46.             //logerror("CPU #0 PC %06x: warning - read unmapped memory address %06x\n",cpu_get_pc(),0x30c000+offset);
  47.             return i8751_return;
  48.     }
  49.  
  50.     logerror("CPU #0 PC %06x: warning - read unmapped memory address %06x\n",cpu_get_pc(),0x30c000+offset);
  51.     return 0xffff;
  52. }
  53.  
  54. /******************************************************************************/
  55.  
  56. READ_HANDLER( dec0_rotary_r )
  57. {
  58.     switch (offset)
  59.     {
  60.         case 0: /* Player 1 rotary */
  61.             return ~(1 << (readinputport(5) * 12 / 256));
  62.  
  63.         case 8: /* Player 2 rotary */
  64.             return ~(1 << (readinputport(6) * 12 / 256));
  65.  
  66.         default:
  67.             logerror("Unknown rotary read at 300000 %02x\n",offset);
  68.     }
  69.  
  70.     return 0;
  71. }
  72.  
  73. /******************************************************************************/
  74.  
  75. READ_HANDLER( midres_controls_r )
  76. {
  77.     switch (offset)
  78.     {
  79.         case 0: /* Player 1 Joystick + start, Player 2 Joystick + start */
  80.             return (readinputport(0) + (readinputport(1) << 8));
  81.  
  82.         case 2: /* Dipswitches */
  83.             return (readinputport(3) + (readinputport(4) << 8));
  84.  
  85.         case 4: /* Player 1 rotary */
  86.             return ~(1 << (readinputport(5) * 12 / 256));
  87.  
  88.         case 6: /* Player 2 rotary */
  89.             return ~(1 << (readinputport(6) * 12 / 256));
  90.  
  91.         case 8: /* Credits, start buttons */
  92.             return readinputport(2);
  93.  
  94.         case 12:
  95.             return 0;    /* ?? watchdog ?? */
  96.     }
  97.  
  98.     logerror("PC %06x unknown control read at %02x\n",cpu_get_pc(),0x180000+offset);
  99.     return 0xffff;
  100. }
  101.  
  102. /******************************************************************************/
  103.  
  104. READ_HANDLER( slyspy_controls_r )
  105. {
  106.     switch (offset)
  107.     {
  108.         case 0: /* Dip Switches */
  109.             return (readinputport(3) + (readinputport(4) << 8));
  110.  
  111.         case 2: /* Player 1 & Player 2 joysticks & fire buttons */
  112.             return (readinputport(0) + (readinputport(1) << 8));
  113.  
  114.         case 4: /* Credits */
  115.             return readinputport(2);
  116.     }
  117.  
  118.     logerror("Unknown control read at 30c000 %d\n",offset);
  119.     return 0xffff;
  120. }
  121.  
  122. READ_HANDLER( slyspy_protection_r )
  123. {
  124.     /* These values are for Boulderdash, I have no idea what they do in Slyspy */
  125.     switch (offset) {
  126.         case 0:     return 0;
  127.         case 2:     return 0x13;
  128.         case 4:        return 0;
  129.         case 6:        return 0x2;
  130.     }
  131.  
  132.     logerror("%04x, Unknown protection read at 30c000 %d\n",cpu_get_pc(),offset);
  133.     return 0;
  134. }
  135.  
  136. /*
  137.     The memory map in Sly Spy can change between 4 states according to the protection!
  138.  
  139.     Default state (called by Traps 1, 3, 4, 7, C)
  140.  
  141.     240000 - 24001f = control   (Playfield 2 area)
  142.     242000 - 24207f = colscroll
  143.     242400 - 2425ff = rowscroll
  144.     246000 - 2467ff = data
  145.  
  146.     248000 - 24801f = control  (Playfield 1 area)
  147.     24c000 - 24c07f = colscroll
  148.     24c400 - 24c4ff = rowscroll
  149.     24e000 - 24e7ff = data
  150.  
  151.     State 1 (Called by Trap 9) uses this memory map:
  152.  
  153.     248000 = pf1 data
  154.     24c000 = pf2 data
  155.  
  156.     State 2 (Called by Trap A) uses this memory map:
  157.  
  158.     240000 = pf2 data
  159.     242000 = pf1 data
  160.     24e000 = pf1 data
  161.  
  162.     State 3 (Called by Trap B) uses this memory map:
  163.  
  164.     240000 = pf1 data
  165.     248000 = pf2 data
  166.  
  167. */
  168.  
  169. WRITE_HANDLER( slyspy_state_w )
  170. {
  171.     slyspy_state=0;
  172. }
  173.  
  174. READ_HANDLER( slyspy_state_r )
  175. {
  176.     slyspy_state++;
  177.     slyspy_state=slyspy_state%4;
  178.     return 0; /* Value doesn't mater */
  179. }
  180.  
  181. WRITE_HANDLER( slyspy_240000_w )
  182. {
  183.     switch (slyspy_state) {
  184.         case 0x3:
  185.             dec0_pf1_data_w(offset,data);
  186.             return;
  187.         case 0x2:
  188.             dec0_pf2_data_w(offset,data);
  189.             return;
  190.         case 0x0:
  191.             if (offset<0x10) dec0_pf2_control_0_w(offset,data);
  192.             else if (offset<0x20) dec0_pf2_control_1_w(offset-0x10,data);
  193.             return;
  194.     }
  195.     logerror("Wrote to 240000 %02x at %04x %04x (Trap %02x)\n",offset,cpu_get_pc(),data,slyspy_state);
  196. }
  197.  
  198. WRITE_HANDLER( slyspy_242000_w )
  199. {
  200.     switch (slyspy_state) {
  201.         case 0x2: /* Trap A */
  202.             dec0_pf1_data_w(offset,data);
  203.             return;
  204.         case 0x0: /* Trap C */
  205.             if (offset<0x80) dec0_pf2_colscroll_w(offset,data);
  206.             else if (offset<0x600) dec0_pf2_rowscroll_w(offset-0x400,data);
  207.             return;
  208.     }
  209.     logerror("Wrote to 242000 %02x at %04x %04x (Trap %02x)\n",offset,cpu_get_pc(),data,slyspy_state);
  210. }
  211.  
  212. WRITE_HANDLER( slyspy_246000_w )
  213. {
  214.     switch (slyspy_state) {
  215.         case 0x0:
  216.             dec0_pf2_data_w(offset,data);
  217.             return;
  218.     }
  219.     logerror("Wrote to 246000 %02x at %04x %04x (Trap %02x)\n",offset,cpu_get_pc(),data,slyspy_state);
  220. }
  221.  
  222. WRITE_HANDLER( slyspy_248000_w )
  223. {
  224.     switch (slyspy_state) {
  225.         case 0x1:
  226.             dec0_pf1_data_w(offset,data);
  227.             return;
  228.         case 0x3:
  229.             dec0_pf2_data_w(offset,data);
  230.             return;
  231.         case 0x0:
  232.             if (offset<0x10) dec0_pf1_control_0_w(offset,data);
  233.             else if (offset<0x20) dec0_pf1_control_1_w(offset-0x10,data);
  234.             return;
  235.     }
  236.     logerror("Wrote to 248000 %02x at %04x %04x (Trap %02x)\n",offset,cpu_get_pc(),data,slyspy_state);
  237. }
  238.  
  239. WRITE_HANDLER( slyspy_24c000_w )
  240. {
  241.     switch (slyspy_state) {
  242.         case 0x1: /* Trap 9 */
  243.             dec0_pf2_data_w(offset,data);
  244.             return;
  245.         case 0x0: /* Trap C */
  246.             if (offset<0x80) dec0_pf1_colscroll_w(offset,data);
  247.             else if (offset<0x600) dec0_pf1_rowscroll_w(offset-0x400,data);
  248.             return;
  249.     }
  250.     logerror("Wrote to 24c000 %02x at %04x %04x (Trap %02x)\n",offset,cpu_get_pc(),data,slyspy_state);
  251. }
  252.  
  253. WRITE_HANDLER( slyspy_24e000_w )
  254. {
  255.     switch (slyspy_state) {
  256.         case 0x2:
  257.         case 0x0:
  258.             dec0_pf1_data_w(offset,data);
  259.             return;
  260.     }
  261.     logerror("Wrote to 24e000 %02x at %04x %04x (Trap %02x)\n",offset,cpu_get_pc(),data,slyspy_state);
  262. }
  263.  
  264. /******************************************************************************/
  265.  
  266. static int share[0xff];
  267. static int hippodrm_msb,hippodrm_lsb;
  268.  
  269. READ_HANDLER( hippodrm_prot_r )
  270. {
  271. //logerror("6280 PC %06x - Read %06x\n",cpu_getpc(),offset+0x1d0000);
  272.     if (hippodrm_lsb==0x45) return 0x4e;
  273.     if (hippodrm_lsb==0x92) return 0x15;
  274.     return 0;
  275. }
  276.  
  277. WRITE_HANDLER( hippodrm_prot_w )
  278. {
  279.     switch (offset) {
  280.         case 4:    hippodrm_msb=data; break;
  281.         case 5:    hippodrm_lsb=data; break;
  282.     }
  283. //logerror("6280 PC %06x - Wrote %06x to %04x\n",cpu_getpc(),data,offset+0x1d0000);
  284. }
  285.  
  286. READ_HANDLER( hippodrm_shared_r )
  287. {
  288.     return share[offset];
  289. }
  290.  
  291. WRITE_HANDLER( hippodrm_shared_w )
  292. {
  293.     share[offset]=data;
  294. }
  295.  
  296. static READ_HANDLER( hippodrm_68000_share_r )
  297. {
  298.     if (offset==0) cpu_yield(); /* A wee helper */
  299.     return share[offset/2];
  300. }
  301.  
  302. static WRITE_HANDLER( hippodrm_68000_share_w )
  303. {
  304.     share[offset/2]=data&0xff;
  305. }
  306.  
  307. /******************************************************************************/
  308.  
  309. static void hbarrel_i8751_write(int data)
  310. {
  311.     static int level,state;
  312.  
  313.     int title[]={  1, 2, 5, 6, 9,10,13,14,17,18,21,22,25,26,29,30,33,34,37,38,41,42,0,
  314.                  3, 4, 7, 8,11,12,15,16,19,20,23,24,27,28,31,32,35,36,39,40,43,44,0,
  315.                 45,46,49,50,53,54,57,58,61,62,65,66,69,70,73,74,77,78,81,82,0,
  316.                 47,48,51,52,55,56,59,60,63,64,67,68,71,72,75,76,79,80,83,84,0,
  317.                 85,86,89,90,93,94,97,98,101,102,105,106,109,110,113,114,117,118,121,122,125,126,0,
  318.                 87,88,91,92,95,96,99,100,103,104,107,108,111,112,115,116,119,120,123,124,127,128,0,
  319.                 129,130,133,134,137,138,141,142,145,146,149,150,153,154,157,158,161,162,165,166,169,170,173,174,0,
  320.                 131,132,135,136,139,140,143,144,147,148,151,152,155,156,159,160,163,164,167,168,171,172,175,176,0,
  321.                 0x10b1,0x10b2,0,0x10b3,0x10b4,-1
  322.     };
  323.  
  324.     /* This table is from the USA version - others could be different.. */
  325.     int weapons_table[][0x20]={
  326.         { 0x558,0x520,0x5c0,0x600,0x520,0x540,0x560,0x5c0,0x688,0x688,0x7a8,0x850,0x880,0x880,0x990,0x9b0,0x9b0,0x9e0,0xffff }, /* Level 1 */
  327.         { 0x330,0x370,0x3d8,0x580,0x5b0,0x640,0x6a0,0x8e0,0x8e0,0x940,0x9f0,0xa20,0xa50,0xa80,0xffff }, /* Level 2 */
  328.         { 0xb20,0xbd0,0xb20,0xb20,0xbd8,0xb50,0xbd8,0xb20,0xbe0,0xb40,0xb80,0xa18,0xa08,0xa08,0x980,0x8e0,0x780,0x790,0x650,0x600,0x5d0,0x5a0,0x570,0x590,0x5e0,0xffff }, /* Level 3 */
  329.         { 0x530,0x5d0,0x5e0,0x5c8,0x528,0x520,0x5d8,0x5e0,0x5d8,0x540,0x570,0x5a0,0x658,0x698,0x710,0x7b8,0x8e0,0x8e0,0x8d8,0x818,0x8e8,0x820,0x8e0,0x848,0x848,0xffff }, /* Level 4 */
  330.         { 0x230,0x280,0x700,0x790,0x790,0x7e8,0x7e8,0x8d0,0x920,0x950,0xad0,0xb90,0xb50,0xb10,0xbe0,0xbe0,0xffff }, /* Level 5 */
  331.         { 0xd20,0xde0,0xd20,0xde0,0xd80,0xd80,0xd90,0xdd0,0xdb0,0xb20,0xa40,0x9e0,0x960,0x8a0,0x870,0x840,0x7e0,0x7b0,0x780,0xffff }, /* Level 6 */
  332.         { 0x730,0x7e0,0x720,0x7e0,0x740,0x7c0,0x730,0x7d0,0x740,0x7c0,0x730,0x7d0,0x720,0x7e0,0x720,0x7e0,0x720,0x7e0,0x720,0x7e0,0x730,0x7d0,0xffff } /* Level 7 */
  333.     };
  334.  
  335.     switch (data>>8) {
  336.         case 0x2:    /* Selects level */
  337.             i8751_return=level;
  338.             break;
  339.         case 0x3:    /* Increment level counter */
  340.             level++;
  341.             i8751_return=0x301;
  342.             break;
  343.         case 0x5:    /* Set level 0 */
  344.             i8751_return=0xb3b;
  345.             level=0;
  346.             break;
  347.         case 0x06:    /* Controls appearance & placement of special weapons */
  348.             i8751_return=weapons_table[level][data&0x1f];
  349.             //logerror("CPU #0 PC %06x: warning - write %02x to i8751, returning %04x\n",cpu_get_pc(),data,i8751_return);
  350.             break;
  351.         case 0xb:    /* Initialise the variables? */
  352.             i8751_return=0;
  353.             break;
  354.         default:
  355.             i8751_return=0;
  356.     }
  357.  
  358.     /* Protection */
  359.     if (data==7) i8751_return=0xc000; /* Stack pointer */
  360.     if (data==0x175) i8751_return=0x68b; /* ID check - USA version */
  361.     if (data==0x174) i8751_return=0x68c; /* ID check - World version */
  362.  
  363.     /* All commands in range 4xx are related to title screen.. */
  364.     if (data==0x4ff) state=0;
  365.     if (data>0x3ff && data<0x4ff) {
  366.         state++;
  367.  
  368.         if (title[state-1]==0) i8751_return=0xfffe;
  369.         else if (title[state-1]==-1) i8751_return=0xffff;
  370.         else if (title[state-1]>0x1000) i8751_return=(title[state-1]&0xfff)+128+15;
  371.         else i8751_return=title[state-1]+128+15+0x2000;
  372.  
  373.         /* We have to use a state as the microcontroller remembers previous commands */
  374.     }
  375.  
  376. //logerror("CPU #0 PC %06x: warning - write %02x to i8751\n",cpu_get_pc(),data);
  377. }
  378.  
  379. static void baddudes_i8751_write(int data)
  380. {
  381.     i8751_return=0;
  382.  
  383.     switch (data&0xffff) {
  384.         case 0x714: i8751_return=0x700; break;
  385.         case 0x73b: i8751_return=0x701; break;
  386.         case 0x72c: i8751_return=0x702; break;
  387.         case 0x73f: i8751_return=0x703; break;
  388.         case 0x755: i8751_return=0x704; break;
  389.         case 0x722: i8751_return=0x705; break;
  390.         case 0x72b: i8751_return=0x706; break;
  391.         case 0x724: i8751_return=0x707; break;
  392.         case 0x728: i8751_return=0x708; break;
  393.         case 0x735: i8751_return=0x709; break;
  394.         case 0x71d: i8751_return=0x70a; break;
  395.         case 0x721: i8751_return=0x70b; break;
  396.         case 0x73e: i8751_return=0x70c; break;
  397.         case 0x761: i8751_return=0x70d; break;
  398.         case 0x753: i8751_return=0x70e; break;
  399.         case 0x75b: i8751_return=0x70f; break;
  400.     }
  401.  
  402.     if (!i8751_return) logerror("%04x: warning - write unknown command %02x to 8571\n",cpu_get_pc(),data);
  403. }
  404.  
  405. static void birdtry_i8751_write(int data)
  406. {
  407.     i8751_return=0;
  408.  
  409.     logerror("%04x: warning - write unknown command %02x to 8571\n",cpu_get_pc(),data);
  410.  
  411. if ((data&0xff00)==0x200) i8751_return=0x300;
  412. if ((data&0xff00)==0x300) i8751_return=0x200;
  413.  
  414.  
  415. //i8751_return=0x200;
  416.     return;
  417. /*
  418.     switch (data&0xffff) {
  419.         case 0x714: i8751_return=0x700; break;
  420.         case 0x73b: i8751_return=0x701; break;
  421.         case 0x72c: i8751_return=0x702; break;
  422.         case 0x73f: i8751_return=0x703; break;
  423.         case 0x755: i8751_return=0x704; break;
  424.         case 0x722: i8751_return=0x705; break;
  425.         case 0x72b: i8751_return=0x706; break;
  426.         case 0x724: i8751_return=0x707; break;
  427.         case 0x728: i8751_return=0x708; break;
  428.         case 0x735: i8751_return=0x709; break;
  429.         case 0x71d: i8751_return=0x70a; break;
  430.         case 0x721: i8751_return=0x70b; break;
  431.         case 0x73e: i8751_return=0x70c; break;
  432.         case 0x761: i8751_return=0x70d; break;
  433.         case 0x753: i8751_return=0x70e; break;
  434.         case 0x75b: i8751_return=0x70f; break;
  435.     }
  436.  
  437.     if (!i8751_return) logerror("%04x: warning - write unknown command %02x to 8571\n",cpu_get_pc(),data);
  438. */
  439. }
  440.  
  441. static void *i8751_timer;
  442.  
  443. static void i8751_callback(int param)
  444. {
  445.     /* Signal main cpu microcontroller task is complete */
  446.     cpu_cause_interrupt(0,5);
  447.  
  448.     timer_remove(i8751_timer);
  449.     i8751_timer=NULL;
  450.  
  451.  
  452. logerror("i8751:  Timer called!!!\n");
  453.  
  454. }
  455.  
  456. void dec0_i8751_write(int data)
  457. {
  458.     /* Writes to this address cause an IRQ to the i8751 microcontroller */
  459.     if (GAME==1) hbarrel_i8751_write(data);
  460.     if (GAME==2) baddudes_i8751_write(data);
  461.     if (GAME==3) birdtry_i8751_write(data);
  462.  
  463.     cpu_cause_interrupt(0,5);
  464.  
  465.     /* Simulate the processing time of the i8751, time value is guessed
  466.     if (i8751_timer) {
  467.         logerror("i8751:  Missed a timer!!!\n");
  468.     }
  469.     else
  470.         i8751_timer = timer_set(TIME_NOW, 0, i8751_callback);*/
  471.  
  472. /* There is a timing problem in Heavy Barrel if the processing time is not
  473. simulated - if the interrupt is triggered straight away then HB will reset
  474. at the end of level one, the processing time needs to be at least the cycles
  475. of a TST.W + BMI.S (ie, not very much at all).
  476.  
  477. See the code about 0xb60 (USA version)
  478.  
  479. */
  480.  
  481. logerror("CPU #0 PC %06x: warning - write %02x to i8751\n",cpu_get_pc(),data);
  482.  
  483.  
  484. }
  485.  
  486. void dec0_i8751_reset(void)
  487. {
  488.     i8751_return=0;
  489. }
  490.  
  491. /******************************************************************************/
  492.  
  493. static READ_HANDLER( hbarrel_cycle_r )
  494. {
  495.     if (cpu_get_pc()==0x130ca) {cpu_spinuntil_int(); return 0;} return READ_WORD(&dec0_ram[0x10]);
  496. }
  497.  
  498. static READ_HANDLER( hbarrelu_cycle_r )
  499. {
  500.     if (cpu_get_pc()==0x131a0) {cpu_spinuntil_int(); return 0;} return READ_WORD(&dec0_ram[0x10]);
  501. }
  502.  
  503. static WRITE_HANDLER( sprite_mirror_w )
  504. {
  505.     extern unsigned char *spriteram;
  506.     WRITE_WORD (&spriteram[offset], data);
  507. }
  508.  
  509. /******************************************************************************/
  510.  
  511. static void hbarrel_custom_memory(void)
  512. {
  513.     install_mem_read_handler(0, 0xff8010, 0xff8011, hbarrel_cycle_r);
  514.     GAME=1;
  515. { /* Remove this patch once processing time of i8751 is simulated */
  516. unsigned char *RAM = memory_region(REGION_CPU1);
  517. WRITE_WORD (&RAM[0xb3e],0x8008);
  518. }
  519. }
  520.  
  521. static void hbarrelu_custom_memory(void)
  522. {
  523.     install_mem_read_handler(0, 0xff8010, 0xff8011, hbarrelu_cycle_r);
  524.     GAME=1;
  525.  
  526. { /* Remove this patch once processing time of i8751 is simulated */
  527. unsigned char *RAM = memory_region(REGION_CPU1);
  528. WRITE_WORD (&RAM[0xb68],0x8008);
  529. }
  530. }
  531.  
  532. static void robocop_custom_memory(void)
  533. {
  534.     /* To do */
  535. }
  536.  
  537. static void hippodrm_custom_memory(void)
  538. {
  539.     install_mem_read_handler(0, 0x180000, 0x180fff, hippodrm_68000_share_r);
  540.     install_mem_write_handler(0, 0x180000, 0x180fff, hippodrm_68000_share_w);
  541.     install_mem_write_handler(0, 0xffc800, 0xffcfff, sprite_mirror_w);
  542. }
  543.  
  544. void dec0_custom_memory(void)
  545. {
  546.     GAME=0;
  547.     i8751_timer=NULL;
  548.  
  549.     if (!strcmp(Machine->gamedrv->name,"hbarrelw")) hbarrel_custom_memory();
  550.     if (!strcmp(Machine->gamedrv->name,"hbarrel")) hbarrelu_custom_memory();
  551.     if (!strcmp(Machine->gamedrv->name,"baddudes")) GAME=2;
  552.     if (!strcmp(Machine->gamedrv->name,"drgninja"))    GAME=2;
  553.     if (!strcmp(Machine->gamedrv->name,"birdtry"))     GAME=3;
  554.     if (!strcmp(Machine->gamedrv->name,"robocop")) robocop_custom_memory();
  555.     if (!strcmp(Machine->gamedrv->name,"hippodrm")) hippodrm_custom_memory();
  556.     if (!strcmp(Machine->gamedrv->name,"ffantasy")) hippodrm_custom_memory();
  557. }
  558.